//go:build windows

package util

import (
    "context"
    goruntime "runtime"
    "github.com/getlantern/systray"
    "github.com/wailsapp/wails/v2/pkg/application"
    wruntime "github.com/wailsapp/wails/v2/pkg/runtime"
)

// SystrayUtil 托盘工具
type SystrayUtil struct {
	icon []byte
	ctx  *context.Context
	app  *application.Application
}

func NewSystrayUtil(
	icon []byte,
	ctx *context.Context,
	app *application.Application) *SystrayUtil {
	return &SystrayUtil{
		icon: icon,
		ctx:  ctx,
		app:  app,
	}
}

// Run 运行托盘
func (u *SystrayUtil) Run() {
    // 在托盘线程上锁定 OS 线程，避免频繁右击导致消息循环异常
    goruntime.LockOSThread()
    systray.Run(func() {
        // 初始化托盘图标与菜单（必须在 onReady 回调中同步执行）
        systray.SetIcon(u.icon)
        systray.SetTitle("洛页小工具")
        systray.SetTooltip("洛页小工具")
        // 设置托盘选项
        openWindow := systray.AddMenuItem("显示主界面", "显示主界面")
        hideWindow := systray.AddMenuItem("隐藏到托盘", "隐藏到托盘")
        systray.AddSeparator()
        topWindow := systray.AddMenuItem("置顶", "置顶")
        bottomWindow := systray.AddMenuItem("取消置顶", "取消置顶")
        systray.AddSeparator()
        quitWindow := systray.AddMenuItem("退出程序", "Quit the whole app")

        // 事件监听放入独立 goroutine，避免阻塞 onReady 影响系统菜单交互
        go func() {
            for {
                select {
                case <-openWindow.ClickedCh:
                    wruntime.WindowShow(*u.ctx)
                case <-hideWindow.ClickedCh:
                    wruntime.WindowHide(*u.ctx)
                case <-topWindow.ClickedCh:
                    wruntime.WindowSetAlwaysOnTop(*u.ctx, true)
                case <-bottomWindow.ClickedCh:
                    wruntime.WindowSetAlwaysOnTop(*u.ctx, false)
                case <-quitWindow.ClickedCh:
                    systray.Quit() //退出托盘
                    return
                }
            }
        }()
    }, func() {
        // 退出程序
        u.app.Quit()
        // systray 退出后，该 goroutine 将结束，OS 线程锁自动释放
    })
}
